package com.ant.result;

import com.ant.constant.ResultEnum;
import com.ant.utils.date.DateUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 统一响应结果封装类
 * 
 * 用于封装所有API接口的响应数据，提供统一的返回格式
 * 包含状态码、消息、数据和响应时间等字段
 * 支持泛型，可以返回任意类型的数据
 * 
 * @Auther: 灏
 * @Date: 2025/6/1 - 06 - 01 - 18:03
 * @Description: com.ant.infrastructure.result
 * @version: 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {
    
    /** 响应状态码 - 200表示成功，非200表示失败 */
    private int code;
    
    /** 响应消息 - 用于描述操作结果或错误信息 */
    private String msg;
    
    /** 响应数据 - 返回的业务数据，可以是任意类型 */
    private Object data;
    
    /** 响应时间 - 记录接口响应的时间戳 */
    private String responseTime;

    /**
     * 创建成功响应（无数据）
     * 
     * @param <T> 泛型类型
     * @return 成功响应对象
     */
    public static <T> Result<T> success() {
        return new <T>Result<T>(ResultEnum.SUCCESS.code(),ResultEnum.SUCCESS.message(),null, DateUtil.format());
    }

    /**
     * 创建成功响应（带数据）
     * 
     * @param object 返回的数据对象
     * @param <T> 泛型类型
     * @return 成功响应对象
     */
    public static <T> Result<T> success(Object object) {
        return new <T>Result<T>(ResultEnum.SUCCESS.code(), ResultEnum.SUCCESS.message(), object, DateUtil.format());
    }
    
    /**
     * 创建成功响应（自定义消息和数据）
     * 
     * @param msg 自定义成功消息
     * @param object 返回的数据对象
     * @param <T> 泛型类型
     * @return 成功响应对象
     */
    public static <T> Result<T> success(String msg, Object object) {
        return new <T>Result<T>(ResultEnum.SUCCESS.code(), msg, object, DateUtil.format());
    }

    /**
     * 创建失败响应（无数据）
     * 
     * @param code 错误状态码
     * @param msg 错误消息
     * @param <T> 泛型类型
     * @return 失败响应对象
     */
    public static <T> Result<T> failed(int code, String msg) {
        return new <T>Result<T>(code,msg,null, DateUtil.format());
    }

    /**
     * 创建失败响应（带数据）
     * 
     * @param code 错误状态码
     * @param msg 错误消息
     * @param object 错误相关的数据对象
     * @param <T> 泛型类型
     * @return 失败响应对象
     */
    public static <T> Result<T> failed(int code, String msg, Object object) {
        return new <T>Result<T>(code,msg,object, DateUtil.format());
    }
}
